/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *
 *	            File : 	crcmodel.h
 *       Description :  Параметрическая модельная реализация CRC-алгоритма.
 *
 *						Реализовано на основе материала:
 *						Ross N. Williams - Элементарное руководство по
 *						CRC алгоритмам обнаружения ошибок
 *
 *            Create :  28.02.2013
 *            Author :  Golovchenko Aleksey (lexgolovchenko@gmail.com)
 *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#ifndef CRCMODEL_H_
#define CRCMODEL_H_

#include <iostream>

class CRC_bad_params { };

/*
 * Описание параметров CRC алгоритма
 */
struct CRC_param {
	int width;										// степень полинома в битах [8,32]
	unsigned long poly;								// значение полинома
	unsigned long init;								// начальное значение регистра CRC
	bool refin;										// обращать байты на входе
	bool refout;									// обращать результат
	unsigned long xorout;							// для xor-комбинации с конечным значением CRC
};

std::ostream & operator << (std::ostream &out, const CRC_param &p);

/*
 * Модель CRC-алгоритма
 */
class CRC_model {
public:
	CRC_model(const CRC_param &);

	void reset();									// установка модели в начальное состояния
	void process_byte(int byte);					// обработка одного байта, промеж. рез в m_CRC
	void process_msg(void *data, int size);			// обработка блока байтов

	unsigned long get_CRC_reg();					// промежуточное значение
	unsigned long get_CRC();						// результат

	unsigned long get_table_elem(int i);			// i-элемент CRC-таблицы

protected:
	static unsigned long reflect(unsigned long num, const int bcnt);

	const CRC_param m_param;						// параметры CRC-алгоритма
	unsigned long m_CRC;							// регистр для вычисления CRC
};

#endif
